<template>
	<view class="container">
		<!-- 公共组件-每个页面必须引入 -->
		<public-module></public-module>
		
		<view class="shuzi-container" :style="bgImageStyle">
			<!-- 右上角图片 -->
			<view class="top-right-image" @click="speakWelcomeMessage">
				<image src="../../static/shuziren/01.png" mode="aspectFit"></image>
			</view>
			
			<!-- 数字人展示区域 -->
			<view class="digital-human-area">
				<!-- 左侧功能按钮 -->
				<view class="left-buttons">
					<image src="../../static/shuziren/02.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
					<image src="../../static/shuziren/03.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
					<image src="../../static/shuziren/04.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
				</view>
				
				<!-- 数字人容器 -->
				<view class="digital-human-wrapper">
					<view class="wrapper"></view>  <!-- 数字人SDK渲染容器 -->
				</view>
				
				<!-- 右侧功能按钮 -->
				<view class="right-buttons">
					<image src="../../static/shuziren/07.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
					<image src="../../static/shuziren/06.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
					<image src="../../static/shuziren/05.png" mode="aspectFit" class="function-image" @click="showUpgrading"></image>
				</view>
			</view>
			<!-- <view class="prompt-bar">
				<text>{{ isRecording ? '松开结束' : '请说：你好, 小可，来唤醒我！' }}</text>
				
				<view class="voice-btn" 
					
					:class="{ 'recording': isRecording }">
					<text>{{ isRecording ? '松开结束' : '按住说话' }}</text>
				</view>
			</view>
				<view class="message-display">
					<scroll-view scroll-y class="message-scroll" :scroll-top="scrollTop" :scroll-with-animation="true">
						<view class="single-message">
							{{ currentMessage }}
						</view>
					</scroll-view>
				</view> -->
			<!-- 提示条 - 用于显示"请说你好小可来唤醒我"和语音按钮 -->
			<view class="prompt-bar">
				<text v-if="currentQuestion">{{ currentQuestion }}</text>
				<text v-else>{{ isRecording ? currentUserSpeech : '请说：你好, 小可，来唤醒我！' }}</text>
				
				<view class="voice-btn" 
					@touchstart="startRecording" 
					@touchend="stopRecording"
					@touchcancel="cancelRecording"
					:class="{ 'recording': isRecording }">
					<text>{{ isRecording ? '松开结束' : '按住说话' }}</text>
				</view>
			</view>
			
			<!-- 对话内容显示区域 -->
			<view class="message-display">
				<scroll-view scroll-y class="message-scroll" :scroll-top="scrollTop" :scroll-with-animation="true">
					<view class="single-message">
						{{ currentMessage }}
					</view>
				</scroll-view>
			</view>
		</view>
	</view>
</template>

<script>
import $http from '@/config/requestConfig'
import AvatarPlatform, {
	PlayerEvents,
	SDKEvents,
} from './sdk/3.0.0.1002/index.js'
import backgroundImage from '../../static/shuziren/08.png' // 导入背景图片
import jsBridge from 'ym-jsbridge'

export default {
	data() {
		return {
			apiConfig: {
				appId: 'f61e6a5d',
				apiKey: '8c32ea5744b2e56c566beda85cb75396',
				apiSecret: 'ZDZkMmJkMzE3NDU4NDZiODAwZjY1N2Nl',
				virtualHumanId: '110117005',
				sceneId: '170737316707569664', 
				vcn: 'x4_yezi'
			},
			loading: true,
			showPlayNotAllowedTip: false,
			welcomeMessage: '大家好，我是新吴区政务服务中心AI数字人助手许小可，很高兴为您服务！您只需说出唤醒口令"你好小可"，即可随时与我互动。我的核心使命是：精准解答——提供政策咨询、业务办理指南；智能导办——实时大厅取号、窗口导航、材料预审提醒。"数据多跑路，群众少跑腿"是我的服务理念。无论是企业开办"一件事"专区的流程指引，还是个人事项的进度查询，小可都将以"秒回响应+语音交互"全程陪伴，确保您"只进一扇门，办成所有事"。新吴政务，智惠民生。期待用我的AI温度，为您点亮每一次办事体验！',
			messages: [], // 仍然保留存储对话消息，用于历史记录
			currentMessage: '', // 新增：当前显示在对话区域的消息
			currentUserSpeech: '', // 新增：当前用户语音识别的文本
			scrollTop: 0, // 控制滚动位置
			chatResponse: '',
			userInput: '您好，小可',
			isRecording: false,
			recorder: null,
			micPermissionGranted: false, // 标记麦克风权限是否已授予
			bgImageStyle: {}, // 背景图片样式
			bgImageLoaded: false, // 背景图片是否已加载
			currentQuestion: '', // 当前提问的问题
			isThinking: false, // 是否在思考中
		}
	},

	async onShow() {
		// 页面加载即初始化数字人
		uni.showLoading({
			title: '正在初始化...'
		});
		
		try {
			// 设置背景图片
			this.setBackgroundImage();
			
			// 预先请求麦克风权限
			await this.requestAudioPermission();
			
			// 初始化数字人SDK
			await this.initAvatarSDK();
			
			
			// 添加全局点击事件解锁音频播放
			document.addEventListener('click', this.unlockAudioOnUserInteraction);
		} catch (error) {
			console.error('初始化失败:', error);
			uni.showToast({
				title: '初始化失败，请重试：'+error,
				icon: 'none'
			});
		} finally {
			uni.hideLoading();
		}
	},
	
	onUnload() {
		// 页面卸载时移除事件监听
		document.removeEventListener('click', this.unlockAudioOnUserInteraction);
		
		// 页面卸载时关闭录音
		if (this.recorder) {
			this.recorder.stopRecord();
		}
		
		// 销毁数字人实例
		if (this.avatarPlatform) {
			try {
				this.avatarPlatform.destroy();
			} catch (error) {
				console.error('销毁数字人实例失败:', error);
			}
		}
	},

	methods: {
		// 设置背景图片
		setBackgroundImage() {
			try {
				console.log('加载背景图片:', backgroundImage);
				// 创建一个Image对象来加载背景图片
				const img = new Image();
				img.src = backgroundImage;
				
				// 图片加载成功后设置背景
				img.onload = () => {
					console.log('背景图片加载成功');
					this.bgImageStyle = {
						backgroundImage: `url(${backgroundImage})`,
						backgroundSize: 'cover',
						backgroundPosition: 'center',
						backgroundRepeat: 'no-repeat'
					};
					this.bgImageLoaded = true;
				};
				
				// 图片加载失败时使用备用样式
				img.onerror = (error) => {
					console.error('背景图片加载失败:', error);
					this.bgImageStyle = {
						backgroundColor: '#000' // 使用黑色作为备用背景色
					};
					// 显示加载失败提示
					uni.showToast({
						title: '背景图片加载失败',
						icon: 'none',
						duration: 2000
					});
				};
			} catch (error) {
				console.error('设置背景图片时出错:', error);
				this.bgImageStyle = {
					backgroundColor: '#000' // 出错时使用黑色作为备用背景色
				};
			}
		},
		
		// 预先请求麦克风权限
		async requestAudioPermission() {
			if (jsBridge.inApp) {
				// 只申请权限，不做录音
				return new Promise((resolve) => {
					jsBridge.requestPermissions(["Microphone"], (res) => {
						resolve(res.granted);
					});
				});
			} else {
				try {
					const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
					stream.getTracks().forEach(track => track.stop());
					return true;
				} catch (error) {
					return false;
				}
			}
		},
		
		async initAvatarSDK() {
			try {
				console.log('开始初始化SDK...')

				// 1. 创建实例，添加基本配置
				this.avatarPlatform = new AvatarPlatform({
					useInlinePlayer: true, // 启用内置播放器
					// 音频相关配置
					audio: {
						autoplay: true,
						preferWebAudio: true,
						useAudioWorklet: true // 添加这一行，使用新的AudioWorklet API
					}
				})

				// 2. 设置API信息
				this.avatarPlatform.setApiInfo({
					appId: this.apiConfig.appId,
					apiKey: this.apiConfig.apiKey,
					apiSecret: this.apiConfig.apiSecret,
					sceneId: this.apiConfig.sceneId,
					serverUrl: 'wss://avatar.cn-huadong-1.xf-yun.com/v1/interact' // 显式设置服务器URL
				})

				// 3. 设置全局参数
				this.avatarPlatform.setGlobalParams({
					avatar_dispatch: { 
						interactive_mode: 1, // 使用打断模式
						content_analysis: 0  // 关闭情感分析
					},
					stream: {
						protocol: 'xrtc',
						alpha: 1,
						bitrate: 1000000, // 设置合适的码率
						fps: 25 // 设置帧率
					},
					avatar: {
						avatar_id: this.apiConfig.virtualHumanId,
						width: 1080,
						height: 1920,
						scale: 1.0 // 确保缩放比例正确
					},
					tts: {
						vcn: this.apiConfig.vcn,
						volume: 100,
						speed: 50,
						pitch: 50 // 添加语调参数
					},
					audio: {
						optimization: true
					},
					asr: {
						vad_eos: 3000, // 设置VAD结束时间，单位毫秒
						timeout: 15000, // 设置ASR超时时间，增大超时时间避免超时错误
						addPct: 0.5 // 设置置信度过滤比例
					}
				})

				// 4. 设置事件监听
				this.setupSDKEvents();

				// 5. 等待DOM渲染完成
				await this.$nextTick()

				// 6. 发起连接
				const wrapper = document.querySelector('.wrapper')
				if (!wrapper) {
					throw new Error('找不到视频容器元素')
				}

				await this.avatarPlatform.start({
					wrapper: wrapper
				})

				// 7. 获取播放器实例并立即设置音量
				this.player = this.avatarPlatform.player || this.avatarPlatform.createPlayer()
				if (this.player) {
					this.setupPlayerEvents()
					this.player.volume = 1.0
					await this.player.resume().catch(() => {
						console.log('初始化时恢复播放器')
					})
				}

				console.log('SDK初始化成功')
				this.loading = false

			} catch (error) {
				console.error('SDK初始化失败:', error)
				uni.showToast({
					title: 'SDK初始化失败: ' + error.message,
					icon: 'none',
					duration: 3000
				})
				throw error
			}
		},
		
		// 修改SDK事件监听方法
		setupSDKEvents() {
			if (!this.avatarPlatform) {
				console.warn('avatarPlatform未初始化，无法设置事件监听');
				return;
			}
			
			// 存储中间识别结果
			let pendingAsrText = '';
			let finalAsrText = '';
			let asrResultTimeout = null;
			console.log('我进来了')
			this.avatarPlatform
				.on(SDKEvents.connected, (initResp) => {
					console.log('数字人连接成功:', initResp);
					this.loading = false;
				})
				.on(SDKEvents.stream_start, () => {
					console.log('数字人开始推流');
					// 确保音频可以播放
					if (this.player) {
						this.player.resume().catch(() => {});
					}
				})
				.on(SDKEvents.frame_start, () => {
					console.log('开始接收帧数据');
				})
				.on(SDKEvents.frame_stop, () => {
					console.log('数字人语音播报结束');
				})
				.on(SDKEvents.disconnected, async (err) => {
					console.log('数字人连接断开');
					this.loading = true;
					
					if (err) {
						console.error('数字人连接异常断开:', err);
						// 尝试重新连接
						try {
							await this.reconnectSDK();
						} catch (reconnectError) {
							console.error('重新连接失败:', reconnectError);
							uni.showToast({
								title: '连接断开，请刷新页面',
								icon: 'none',
								duration: 3000
							});
						}
					}
				})
				.on(SDKEvents.error, async (error) => {
					console.error('数字人SDK错误:', error);
					if (error.data) {
						console.error('错误详情:', error.data);
					}
					
					// 根据错误类型进行处理
					if (error.code === 12001 || error.code === 10114) {
						// 连接错误或超时错误，尝试重新连接
						try {
							await this.reconnectSDK();
						} catch (reconnectError) {
							console.error('重新连接失败:', reconnectError);
						}
					}
				})
				.on('nlp', (result) => {
					// 使用事件名称字符串，避免 SDKEvents 常量问题
					console.log('收到NLP结果(nlp):', result);
					if (result && result.content) {
						// 直接更新当前显示消息
						this.$nextTick(() => {
							this.updateCurrentMessage(result.content);
							console.log('已更新数字人回复:', result.content);
						});
						
						// 尝试恢复音频播放
						if (this.player) {
							this.player.resume().catch(() => {});
						}
					
					} else {
						console.warn('NLP结果没有有效的文本内容:', result);
						// 尝试提取可能的文本字段
						this.extractAndUpdateText(result);
					}
				})
				.on(SDKEvents.nlp_result, (result) => {
					console.log('收到NLP结果(nlp_result):', result);
					if (result && result.content) {
						// 直接更新当前显示消息
						this.$nextTick(() => {
							this.updateCurrentMessage(result.content);
							console.log('已更新数字人回复:', result.content);
						});
						
						// 尝试恢复音频播放
						if (this.player) {
							this.player.resume().catch(() => {});
						}
					}
				})
				.on('asr', (result) => {
					// 使用事件名称字符串，避免 SDKEvents 常量问题
					console.log('收到语音识别结果(asr):', result);
					
					// 清除之前的超时计时器
					if (asrResultTimeout) {
						clearTimeout(asrResultTimeout);
						asrResultTimeout = null;
					}
					
					if (result && result.text) {
						const text = result.text.trim();
						const is_end = result.is_end === 1; // 是否是最终结果
						
						if (is_end) {
							// 最终结果
							finalAsrText = text;
							console.log('最终语音识别结果:', finalAsrText);
							
							// 更新用户当前语音文本
							if (finalAsrText && finalAsrText.length > 0) {
								this.$nextTick(() => {
									this.currentUserSpeech = finalAsrText;
									console.log('已更新用户语音文本:', finalAsrText);
									// 添加到消息历史（但不显示）
									this.addMessageToHistory(finalAsrText, 'user');
									// 发送识别结果给数字人进行语义理解
									this.sendMessageToDigitalHuman(finalAsrText);
								});
							}
							
							// 重置临时变量
							pendingAsrText = '';
							finalAsrText = '';
						} else {
							// 中间结果 - 实时更新用户语音文本
							pendingAsrText = text;
							this.currentUserSpeech = pendingAsrText;
							console.log('中间语音识别结果:', pendingAsrText);
							
							// 设置超时，如果1秒内没有新的识别结果，则把当前结果当作最终结果
							asrResultTimeout = setTimeout(() => {
								console.log('语音识别超时，使用当前结果:', pendingAsrText);
								if (pendingAsrText && pendingAsrText.length > 0) {
									this.$nextTick(() => {
										this.currentUserSpeech = pendingAsrText;
										// 添加到消息历史（但不显示）
										this.addMessageToHistory(pendingAsrText, 'user');
										console.log('已更新用户语音文本(超时):', pendingAsrText);
										// 发送识别结果给数字人进行语义理解
										this.sendMessageToDigitalHuman(pendingAsrText);
									});
								}
								
								// 重置临时变量
								pendingAsrText = '';
								finalAsrText = '';
							}, 1000);
						}
					}
				});
				
			// 添加日志辅助函数，记录所有事件类型
			const availableEvents = Object.values(SDKEvents);
			console.log('可用事件类型:', availableEvents);
			
			// 为所有可能的事件添加一个通用日志处理器
			availableEvents.forEach(eventName => {
				if (!['connected', 'stream_start', 'frame_start', 'frame_stop', 'disconnected', 'error', 'nlp_result', 'asr'].includes(eventName)) {
					this.avatarPlatform.on(eventName, (data) => {
						console.log(`收到事件[${eventName}]:`, data);
					});
				}
			});
		},
		
		// 修改：从复杂对象中尝试提取文本并直接更新显示
		extractAndUpdateText(obj) {
			// 可能包含文本的字段名称
			const possibleTextFields = ['content'];
			
			// 递归处理返回的结果，尝试找出文本内容
			const extractText = (object, path = '') => {
				if (!object || typeof object !== 'object') return null;
				
				// 直接检查常见文本字段
				for (const field of possibleTextFields) {
					if (object[field] && typeof object[field] === 'string' && object[field].trim() !== '') {
						console.log(`从路径 ${path}.${field} 提取到文本:`, object[field]);
						return object[field];
					}
				}
				
				// 如果object.answer是对象，尝试从中提取
				if (object.answer && typeof object.answer === 'object') {
					// 检查answer对象中的文本字段
					for (const field of possibleTextFields) {
						if (object.answer[field] && typeof object.answer[field] === 'string' && object.answer[field].trim() !== '') {
							console.log(`从路径 ${path}.answer.${field} 提取到文本:`, object.answer[field]);
							return object.answer[field];
						}
					}
				}
				
				// 递归检查所有对象属性
				for (const key in object) {
					if (object[key] && typeof object[key] === 'object') {
						const extracted = extractText(object[key], `${path}.${key}`);
						if (extracted) return extracted;
					}
				}
				
				return null;
			};
			
			// 尝试提取文本
			const extractedText = extractText(obj);
			if (extractedText) {
				this.updateCurrentMessage(extractedText);
				console.log('已从复杂对象提取并更新消息:', extractedText);
			} else {
				console.warn('无法从对象中提取有效文本');
				// 无法提取时，使用默认消息
				this.updateCurrentMessage('收到数字人的回复，但无法解析内容。');
			}
		},
		
		// 修改更新当前消息的方法
		updateCurrentMessage(content) {
			if (!content || content.trim() === '') {
				return;
			}
			
			this.currentMessage = content;
			this.addMessageToHistory(content, 'digital-human');
			
			// 清除思考状态和加载提示
			this.isThinking = false;
			uni.hideLoading();
			
			this.$nextTick(() => {
				this.scrollTop = 9999999;
			});
		},
		
		// 新增：仅添加到消息历史而不显示
		addMessageToHistory(content, type) {
			// 确保内容不为空
			if (!content || content.trim() === '') {
				return;
			}
			
			// 检查是否最近已经添加过相同内容的消息，避免重复
			const recentMessages = this.messages.slice(-3);
			const isDuplicate = recentMessages.some(msg => 
				msg.type === type && msg.content === content
			);
			
			if (isDuplicate) {
				console.log('避免添加重复消息:', content);
				return;
			}
			
			// 添加新消息到历史
			console.log(`添加${type}消息到历史:`, content);
			this.messages.push({
				content,
				type,
				timestamp: Date.now()
			});
		},
		// 有麦克风权限后开始录音的方法（H5专用）
async startRecordingWithPermission() {
    try {
        console.log('使用已获取的权限开始录音');
        // 创建录音器实例
        this.recorder = this.avatarPlatform.recorder || this.avatarPlatform.createRecorder();

        // 设置录音事件监听
        this.recorder.on('error', (error) => {
            console.error('录音错误:', error);
            this.isRecording = false;
            uni.showToast({
                title: '录音出错，请重试',
                icon: 'none'
            });
        });

        // 开始录音（短语音模式，15秒后自动停止）
        await this.recorder.startRecord(15000, () => {
            console.log('录音自动停止');
            this.isRecording = false;
        });

        this.isRecording = true;
        console.log('录音开始成功');
    } catch (error) {
        console.error('启动录音失败:', error);
        this.isRecording = false;
        // 如果录音失败，可能是权限被撤销或其他原因
        if (error.name === 'NotAllowedError' ||
            (error.message && error.message.includes('Permission denied'))) {
            // 重置权限状态，下次需要重新获取
            this.micPermissionGranted = false;
            uni.showToast({
                title: '麦克风权限丢失，请重新授权',
                icon: 'none',
                duration: 2000
            });
        } else {
            uni.showToast({
                title: '启动录音失败，请重试',
                icon: 'none'
            });
        }
    }
},
		// 修改开始录音方法
		async startRecording() {
			console.log('开始录音');
			if (this.loading) {
				uni.showToast({ title: '正在初始化，请稍候', icon: 'none' });
				return;
			}
			if (this.isRecording) return;
			this.currentUserSpeech = '';
			try {
				// 先尝试解锁音频
				if (this.player) await this.player.resume().catch(() => {});
				// 如果在一门APP里，先申请权限
				if (jsBridge.inApp) {
					const granted = await new Promise((resolve) => {
						jsBridge.requestPermissions(["Microphone"], (res) => {
							resolve(res.granted);
						});
					});
					if (!granted) {
						uni.showToast({ title: '请先授权麦克风', icon: 'none' });
						return;
					}
				}
				// 下面全部用H5逻辑
				if (this.micPermissionGranted) {
					await this.startRecordingWithPermission();
					return;
				}
				// 第一次用，弹窗
				uni.showModal({
					title: '需要麦克风权限',
					content: '为了进行语音交互，应用需要访问您的麦克风。请点击确定授予权限。',
					confirmText: '确定',
					cancelText: '取消',
					success: async (res) => {
						if (res.confirm) {
							try {
								const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
								this.micPermissionGranted = true;
								stream.getTracks().forEach(track => track.stop());
								uni.showToast({
									title: '权限已获取，请再次按住说话按钮开始录音',
									icon: 'none',
									duration: 2000
								});
							} catch (error) {
								uni.showToast({ title: '获取麦克风权限失败', icon: 'none' });
							}
						}
					}
				});
			} catch (error) {
				uni.showToast({ title: '录音失败，请重试', icon: 'none' });
			}
		},

		// 修改停止录音方法
		async stopRecording() {
			if (!this.isRecording) return;
			if (this.recorder) this.recorder.stopRecord();
			this.isRecording = false;
			// 设置思考状态并显示加载中
			this.isThinking = true;
			uni.showLoading({
				title: '思考中...',
				mask: true
			});
			// 保存当前问题
			this.currentQuestion = this.currentUserSpeech;
			// 尝试恢复音频播放
			if (this.player) {
				await this.player.resume().catch(() => {});
			}
		},
		
		// 取消录音
		cancelRecording() {
			console.log('取消录音');
			if (!this.recorder || !this.isRecording) {
				return;
			}
			
			try {
				this.recorder.stopRecord();
				this.isRecording = false;
				uni.showToast({
					title: '已取消',
					icon: 'none'
				});
			} catch (error) {
				console.error('取消录音失败:', error);
			}
		},
		
		// 修改发送消息给数字人的方法
		async sendMessageToDigitalHuman(message) {
			if (!this.avatarPlatform || this.loading) {
				uni.showToast({
					title: '数字人正在初始化，请稍候',
					icon: 'none'
				});
				return;
			}
			
			if (!message || message.trim() === '') {
				console.warn('发送的消息不能为空');
				return;
			}
			
			try {
				console.log('发送消息给数字人:', message);
				
				// 设置当前问题和思考状态
				this.currentQuestion = message;
				this.isThinking = true;
				// 显示加载中
				uni.showLoading({
					title: '思考中...',
					mask: true
				});
				
				// 先尝试解锁音频
				if (this.player) {
					await this.player.resume().catch(() => {});
				}
				
				// 使用writeText方法发送文本并等待响应
				const response = await this.avatarPlatform.writeText(message, {
					nlp: true,
					avatar_dispatch: {
						interactive_mode: 1
					},
					tts: {
						vcn: this.apiConfig.vcn,
						volume: 100,
						speed: 50,
						pitch: 50
					},
					tdp: {
						domain: 'general',
						function: 'chat',
						timeout: 15000
					}
				});
				
				console.log('发送消息响应:', response);
				
				// 如果NLP没有触发回调，等待一段时间后主动获取结果
				setTimeout(() => {
					if (!this.messages.some(msg => msg.type === 'digital-human' && msg.timestamp > Date.now() - 5000)) {
						console.log('NLP回调可能未触发，尝试主动获取结果');
						this.addMessageToHistory('您好，我已收到您的消息，正在处理中...', 'digital-human');
					}
				}, 5000);
				
			} catch (error) {
				console.error('发送消息失败:', error);
				if (error.code === 12001 || error.code === 10114) {
					try {
						await this.reconnectSDK();
						setTimeout(() => {
							this.sendMessageToDigitalHuman(message);
						}, 1000);
					} catch (reconnectError) {
						console.error('重新连接失败:', reconnectError);
					}
				}
				uni.showToast({
					title: '发送失败，请重试',
					icon: 'none'
				});
			} finally {
				// 清除思考状态和加载提示
				this.isThinking = false;
				uni.hideLoading();
			}
		},

		// 添加重新连接方法
		async reconnectSDK() {
			console.log('尝试重新连接SDK...');
			
			try {
				// 先停止当前连接
				if (this.avatarPlatform) {
					await this.avatarPlatform.stop();
				}
				
				// 等待一小段时间
				await new Promise(resolve => setTimeout(resolve, 1000));
				
				// 重新初始化SDK
				await this.initAvatarSDK();
				
				console.log('SDK重新连接成功');
				
			} catch (error) {
				console.error('SDK重新连接失败:', error);
				throw error;
			}
		},

		// 修改播放器事件监听
		setupPlayerEvents() {
			this.player
				?.on(PlayerEvents.play, () => {
					console.log('播放器开始播放');
					this.player.volume = 1.0;
				})
				.on(PlayerEvents.waiting, () => {
					console.log('播放器等待中');
				})
				.on(PlayerEvents.playing, () => {
					console.log('播放器播放中');
					this.player.volume = 1.0;
				})
				.on(PlayerEvents.playNotAllowed, async () => {
					console.log('播放被阻止，尝试恢复...');
					try {
						await this.player.resume();
						this.player.volume = 1.0;
					} catch (error) {
						console.warn('恢复播放失败:', error);
						// 显示提示
						uni.showToast({
							title: '点击任意位置启用声音',
							icon: 'none',
							duration: 2000
						});
					}
				})
				.on(PlayerEvents.error, (err) => {
					console.error('播放器错误:', err);
					// 尝试恢复播放
					this.player.resume().catch(() => {});
				});
		},
		
		// 播放欢迎语（右上角图片点击触发）
		speakWelcomeMessage() {
			if (!this.avatarPlatform || this.loading) {
				uni.showToast({
					title: '数字人正在初始化，请稍候',
					icon: 'none'
				})
				return
			}
			
			try {
				// 提前尝试解锁音频播放
				if (this.player) {
					try {
						this.player.resume().catch(() => {
							console.log('恢复播放器尝试');
						});
					} catch (e) {
						console.log('尝试恢复播放器');
					}
				}
				
				console.log('开始播放欢迎语...');
				
				// 直接在对话区域显示欢迎语消息
				this.updateCurrentMessage(this.welcomeMessage);
				
				// 使用writeText方法发送欢迎语
				this.avatarPlatform.writeText(this.welcomeMessage, {
					nlp: false,
					avatar_dispatch: {
						interactive_mode: 1
					}
				}).then(() => {
					console.log('欢迎语发送成功');
					
					setTimeout(() => {
						if (this.player) {
							try {
								this.player.volume = 1.0;
								this.player.resume().catch(() => {});
							} catch (e) {}
						}
					}, 300);
				}).catch(error => {
					console.error('发送欢迎语失败:', error);
					uni.showToast({
						title: '发送欢迎语失败',
						icon: 'none'
					});
				});
			} catch (error) {
				console.error('调用数字人API失败:', error);
				uni.showToast({
					title: '调用数字人API失败',
					icon: 'none'
				});
			}
		},
		
		// 显示功能升级中提示
		showUpgrading() {
			uni.showToast({
				title: '升级中',
				icon: 'none',
				duration: 1500
			})
		},

		// 添加用户交互解锁音频方法
		unlockAudioOnUserInteraction() {
			// 用户与页面交互后，尝试解锁音频
			console.log('用户交互事件触发，尝试解锁音频');
			this.showPlayNotAllowedTip = false; // 用户已交互
			
			if (this.player) {
				try {
					this.player.resume().then(() => {
						console.log('音频已成功解锁');
					}).catch((e) => {
						console.warn('音频解锁尝试失败:', e);
					});
				} catch (e) {
					console.warn('尝试解锁音频时出错:', e);
				}
			}
		},

		// 修改添加消息方法，避免重复
		addMessage(content, type) {
			// 确保内容不为空
			if (!content || content.trim() === '') {
				return;
			}
			
			// 检查是否最近已经添加过相同内容的消息，避免重复
			const recentMessages = this.messages.slice(-3);
			const isDuplicate = recentMessages.some(msg => 
				msg.type === type && msg.content === content
			);
			
			if (isDuplicate) {
				console.log('避免添加重复消息:', content);
				return;
			}
			
			// 添加新消息
			console.log(`添加${type}消息:`, content);
			this.messages.push({
				content,
				type,
				timestamp: Date.now()
			});
			
			// 更新滚动位置到底部
			this.$nextTick(() => {
				this.scrollTop = 9999999;
			});
		}
	}
}
</script>

<style lang="scss" scoped>
.shuzi-container {
	width: 100%;
	height: 100vh;
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	overflow: hidden;
	/* 删除静态背景图引用，改用动态样式绑定 */
	
	.top-right-image {
		position: absolute;
		top: 40rpx;
		right: 0rpx;
		width: 140rpx;
		height: 80rpx;
		z-index: 10;
		
		image {
			width: 100%;
			height: 100%;
		}
	}
	
	.digital-human-area {
		position: relative;
		width: 100%;
		height: calc(100% - 280rpx); /* 调整高度以适应下方两个区域 */
		display: flex;
		flex-direction: row;
		justify-content: space-between;
		align-items: center;
		
		.left-buttons, .right-buttons {
			width: 35%;
			height: 30%;
			display: flex;
			flex-direction: column;
			justify-content: space-evenly;
			z-index: 3;
			padding: 0 20rpx;
			
			.function-image {
				width: 100%;
				height: 140rpx;
			}
		}
		
		.digital-human-wrapper {
			position: absolute;
			width: 70%; /* 增加宽度使数字人更大 */
			height: 100%;
			left: 50%;
			top: 60%;
			transform: translate(-50%, -50%); /* 精确居中 */
			z-index: 2; /* 确保数字人显示在按钮后面但在背景前面 */
			display: flex;
			justify-content: center;
			align-items: center;
			
			.wrapper {
				width: 100%;
				height: 70%; /* 增大高度占比使数字人更大 */
				transform: scale(1.2) translateY(-10%); /* 放大数字人并稍微上移 */
			}
		}
	}
	
	/* 提示条 - 包含提示文本和按住说话按钮 */
	.prompt-bar {
		position: absolute;
		bottom: 410rpx; /* 位于消息显示区上方 */
		left: 1;
		width: 96%;
		height: 80rpx;
		background-color: rgba(0, 0, 0, 0.6); /* 黑色半透明背景 */
		display: flex;
		align-items: center;
		justify-content: space-between; /* 文本左对齐，按钮右对齐 */
		padding: 0 20rpx;
		box-sizing: border-box;
		z-index: 5;
		
		text {
			color: #FFFFFF;
			font-size: 28rpx;
			line-height: 1.5;
			flex: 1; /* 占据剩余空间 */
		}
		
		.voice-btn {
			display: flex;
			align-items: center;
			background-color: #b7e9f9;
			color: #3b61a9;
			padding: 8rpx 20rpx;
			// border-radius: 40rpx;
			transition: all 0.2s;
			
			image {
				width: 40rpx;
				height: 40rpx;
				margin-right: 10rpx;
			}
			
			text {
				color: #3b61a9;
				font-size: 30rpx;
				font-weight: 800;
				flex: none; /* 不参与flex布局 */
			}
			
			&.recording {
				background-color: #ff4040;
				transform: scale(1.05);
			}
		}
	}
	
	/* 对话内容显示区域 - 修改为单一文本显示 */
	.message-display {
		position: absolute;
		bottom: 10rpx; /* 距离底部30rpx */
		left: 1.5;
		width: 96%;
		min-height: 390rpx;
		max-height: 400rpx; /* 最大高度，超出滚动 */
		background-color: rgba(0, 0, 0, 0.6); /* 黑色半透明背景 */
		display: flex;
		align-items: flex-start; /* 顶部对齐，便于长文本显示 */
		justify-content: flex-start;
		padding: 20rpx 30rpx;
		box-sizing: border-box;
		overflow-y: auto; /* 内容过多时可滚动 */
		z-index: 5;
		
		.message-scroll {
			width: 100%;
			height: 100%;
		}
		
		.single-message {
			width: 100%;
			color: #FFFFFF;
			font-size: 28rpx;
			line-height: 1.5;
			white-space: pre-wrap;
			word-break: break-all;
		}
	}
}
</style>